/*
 * Copyright (c) 2012-2015 The original author or authors
 * ------------------------------------------------------
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Apache License v2.0 which accompanies this distribution.
 *
 * The Eclipse Public License is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * The Apache License v2.0 is available at
 * http://www.opensource.org/licenses/apache2.0.php
 *
 * You may elect to redistribute this code under either of these licenses.
 */
package org.eclipse.moquette.spi.impl;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;

import org.red5.server.mqtt.IAuthenticator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author andrea
 */
public class FileAuthenticator implements IAuthenticator {

	private static final Logger LOG = LoggerFactory.getLogger(FileAuthenticator.class);

	private Map<String, String> m_identities = new HashMap<String, String>();

	public FileAuthenticator(String parent, String filePath) {
		File file = new File(parent, filePath);
		LOG.info("Loading password file: " + file);
		if (file.isDirectory()) {
			LOG.warn(String.format("Bad file reference %s is a directory", file));
			return;
		}

		try {
			FileReader reader = new FileReader(file);
			parse(reader);
		} catch (FileNotFoundException fex) {
			LOG.warn(String.format("Parsing not existing file %s", file), fex);
		} catch (ParseException pex) {
			LOG.warn(String.format("Fromat ero in parsing password file %s", file), pex);
		}
	}

	private void parse(Reader reader) throws ParseException {
		if (reader == null) {
			return;
		}

		BufferedReader br = new BufferedReader(reader);
		String line;
		try {
			while ((line = br.readLine()) != null) {
				int commentMarker = line.indexOf('#');
				if (commentMarker != -1) {
					if (commentMarker == 0) {
						//skip its a comment
						continue;
					} else {
						//it's a malformed comment
						throw new ParseException(line, commentMarker);
					}
				} else {
					if (line.isEmpty() || line.matches("^\\s*$")) {
						//skip it's a black line
						continue;
					}

					//split till the first space
					int deilimiterIdx = line.indexOf(':');
					String username = line.substring(0, deilimiterIdx).trim();
					String password = line.substring(deilimiterIdx + 1).trim();

					m_identities.put(username, password);
				}
			}
		} catch (IOException ex) {
			throw new ParseException("Failed to read", 1);
		}
	}

	public boolean checkValid(String username, String password) {
		String foundPwq = m_identities.get(username);
		if (foundPwq == null) {
			return false;
		}

		return foundPwq.equals(password);
	}

}
